数据抽样

目标:从tb中随机抽样m条(占比为r)数据

粗暴抽样

代码

--1. 利用order by
select * from tb
order by rand()
limit m;

--2. 利用sort by
select * from tb 
distribute by rand() 
sort by rand()
limit m;

逻辑:通过rand()函数将数据随机打散,利用distribute函数,将数据随机分配到不同mapper和reducer,然后对不同的mapper、reducer下的数据进行sort排序,获取到rand的数据~~;order by的方式不会拆分mapper、reducer,而只是通过全局排序进行处理,效率相对distribute会慢很多

数据块抽样

代码

select * from tb
tablesample(r percent) s;

--按照行数进行抽样,限制的行数为每个mapper中获取的样本数,显示为所有mapper的总行数
select * from tb
tablesample(mi rows) s;

桶表抽样

select * from tb
tablesample(bucket 3 out of 32 on rand()) s;

前提:tb为一张桶表

逻辑:建桶表时会确定建了N个桶,N/32决定每个桶有多少个簇,而3代表第三个桶,第三个桶是由第3、3+32 ... 个簇组合而成,这样在抽样时无需扫描整个表,从而加快效率~~

results matching ""

    No results matching ""